#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define MAX_SIZE 10
int buffer[MAX_SIZE] = {0};
int count = 0;

static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void *producer_func(void *arg)
{ // 生产者行为
    while (1)
    {
        usleep(rand() % 500 * 1000); // 随机休眠 0-499ms
        // 加锁
        pthread_mutex_lock(&mutex);
        //  生产商品    ++
        // 如果货柜满了     （放弃锁  给自己加锁） 条件变量
        if (count == MAX_SIZE)
        {
            printf("满啦\n");
            pthread_cond_wait(&cond, &mutex);
        }

        count++;
        buffer[count - 1] = 1;
        printf("生产1个商品,目前还有%d个\n", count);
        // 解锁
        pthread_mutex_unlock(&mutex);
        if (count == MAX_SIZE / 2)
        { // 至少有过半的商品   释放条件变量
            pthread_cond_signal(&cond);
        }
    }
    return NULL;
}

void *consumer_func(void *arg)
{
    while (1)
    {
        usleep(rand() % 300 * 1000); // 随机休眠 0-299ms
        //    加锁
        pthread_mutex_lock(&mutex);

        //      如果货柜没货了 （放弃锁  给自己加锁） 条件变量
        //     消费商品    --
        if (count == 0)
        {
            printf("空啦\n");
            pthread_cond_wait(&cond, &mutex);
        };
        buffer[count - 1] = 0;
        count--;
        printf("消费了1个商品,目前还有%d个\n", count);

        //   解锁
        pthread_mutex_unlock(&mutex);
        //     释放条件变量

        pthread_cond_signal(&cond);
    }
}

int main(int argc, char const *argv[])
{
    // 创建两个i线程 ，一个生产者，一个消费者
    pthread_t producer_t, consumer_t;
    pthread_create(&producer_t, NULL, producer_func, NULL);
    pthread_create(&consumer_t, NULL, consumer_func, NULL);

    pthread_join(producer_t, NULL);
    pthread_join(consumer_t, NULL);

    /* code */
    return 0;
}
